package com.liang.gulimall.product;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/**
 * 1、整合Mybatis-plus
 *      导入依赖
 *      配置：
 *          数据源
 *          配置mybatis-plus
 *              使用@MapperScan
 *              配置xml映射文件位置
 *  2、使用逻辑删除
 *      1）配置全局的逻辑删除规则（可省略）
 *          logic-delete-value:
 *      2）实体类字段上加上@TableLogic注解
 *  3、JSR303数据校验
 *      1）给bean添加检验注解import javax.validation.constraints包下，并定义自己的提示
 *      2）开启校验功能@Valid
 *      3)给校验的bean后紧跟BindingResult，就可以获取到校验的结果
 *      4)分组校验（多场景的复杂校验）
 *          1））给校验注解标注什么情况进行校验
 *          @NotBlank(message = "品牌名必须提交",groups = {AddGroup.class,UpdateGroup.class})
 *          2））@Valid换为@Validated(value = {AddGroup.class})
 *          3))默认没有指定分组的校验注解，在分组校验情况下不生效，只会在@Validated生效
 *      5)自定义校验
 *          1））编写一个自定义的校验注解
 *          2））编写一个自定义的校验器
 *          3））关联校验器校验器和校验注解
 *  4、统一的异常处理
 *  使用MVC提供的@ControllerAdvice
 *  使用@ExceptionHandler标注方法，可以处理的异常
 *  5、整合SpringCache
 * 1、引入依赖
 * 2、写配置
 * (1)、自动配置了哪些
 * 	CacheAuroConfiguration会导入 RedisCacheConfiguration;自动配好了缓存管理器RedisCacheManager
 * (2)、配置使用redis作为缓存
 * 	配置文件中配置，spring.cache.type=redis
 *
 * 3、测试使用缓存
 * 	1）@CacheConfig:主要用于配置该类中会用到的一些共用的缓存配置
 * 	（2）@Cacheable:主要方法返回值加入缓存。同时在查询时，会先从缓存中取，若不存在才再发起对数据库的访问。
 * 	（3）@CachePut:配置于函数上，能够根据参数定义条件进行缓存，与@Cacheable不同的是，每次回真实调用函数，所以主要用于数据新增和修改操作上。
 * 	（4）@CacheEvict:配置于函数上，通常用在删除方法上，用来从缓存中移除对应数据
 * 	（5）@Caching:配置于函数上，组合多个Cache注解使用。
 * 	使用;
 * 	1、启动类开启使用注解@EnableCache
 */
@EnableRedisHttpSession
@EnableCaching
@EnableFeignClients(basePackages = "com.liang.gulimall.product.feign")
@EnableDiscoveryClient
@MapperScan("com.liang.gulimall.product.dao")
@SpringBootApplication
public class GulimallProductApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallProductApplication.class, args);
    }

}
